---
title: 系统实施
---
## 测试原则和方法
系统测试是<font color='RedOrange'>为了发现错误而执行程序的过程，成功的测试是发现了至今尚未发现的错误的测试。</font>
测试是为了找出错误，调试是为了找出错误发生的原因。

### <font color='RedOrange'>测试原则</font>
* 应尽早并不断的进行测试
* 测试工作应该避免由原开发软件的人或小组承担。
* 在设计测试方案时，不仅要确定输入数据，而且要根据系统功能确定预期的输出结果。

**输出结果**
* 既包含有效、合理的测试用例，也包含不合理、失效的用例。
* 检验程序是否做了该做的事，且是否做了不该做的事；
* 严格按照测试计划进行；
* 妥善保存测试计划和测试用例；
* 测试用例可以重复使用或追加测试。


### 软件测试方法
软件测试方法可分为静态测试和动态测试。

:::tip
静态和动态针对的是程序是否运行。
:::

静态测试： 指被测试程序<font color='RedOrange'>不在机器上运行</font>，而采用<font color='RedOrange'>人工检测和计算机辅助静态分析的手段</font>对程序进行检测，包括对文档的静态测试和对代码的静态测试。对文档的静态测试主要以<font color='RedOrange'>检查单</font>的形式进行，而对代码的静态测试，包括<font color='RedOrange'>桌前检查、代码审查、代码走查</font>的方式。使用这种方法能够有效地发现 30%~70% 的逻辑设计和编码错误。


动态测试： 指在计算机上<font color='RedOrange'>实际运行程序</font>进行软件测试，一般采用白盒测试和黑盒测试方法。

黑盒测试法：<font color='RedOrange'>功能性测试</font>，不了解软件代码结构，根据功能设计用例，测试软件功能。

白盒测试法：<font color='RedOrange'>结构性测试</font>，明确代码流程，根据代码逻辑设计用例，进行用例测试。
做白盒测试的人是需要读软件代码的，可以把代码里面所有的分支都走完。

## 测试阶段
1. 单元测试：也成为模块测试，测试的对象是<font color='RedOrange'>可独立编译或汇编的程序模块</font>、软件构件或 OO 软件中的类（统称为模块），<font color='RedOrange'>测试的依据是软件详细设计说明书</font>。

2. 集成测试：目的是<font color='RedOrange'>检查模块之间，以及模块和已集成的软件之间的关系</font>，并验证已集成的软件是否符合设计要求。<font color='RedOrange'>测试的依据是软件概要设计文档</font>。

3. 系统测试：<font color='RedOrange'>测试对象是完整的、集成的计算机系统</font>；测试的目的是在真实系统工作环境下，验证完成的软件配置项是否和系统正确连接，并满足系统/子系统设计文档和软件开发合同规定的要求。测试依据是<font color='RedOrange'>用户需求或开发合同</font>。主要内容包括功能测试、健壮性测试、性能测试、用户界面测试、安全性测试、安装与反安装测试等，其中，最重要的工作是进行功能测试和性能测试。功能测试主要指标有响应时间、吞吐量、并发用户数和资源利用率等

:::tip
系统测试是在确认测试之前，内部进行的一个测试。
:::

4. 确认测试：主要用于<font color='RedOrange'>验证软件的功能、性能和其它特性是否与用户需求一致</font>。测试依据是需求文档。根据用户的参与程度，通常包括以下类型：
    1. 内部确认测试：主要由<font color='RedOrange'>软件开发组织内部按照 SRS 进行测试</font>。
    2. Alpha 测试：<font color='RedOrange'>用户在开发环境下进行测试</font>。
    3. Beta 测试：<font color='RedOrange'>用户在实际使用环境下进行测试</font>，通过测试后，产品才能交付用户。
    4. 验收测试：<font color='RedOrange'>针对 SRS ，在交付前以用户为主进行的测试</font>。其测试对象为完整的、集成的计算机系统。验收测试的目的是，在真实的用户工作环境下，检验软件系统是否满足开发技术合同或 SRS。验收测试的结论是用户确认是否接受该软件的主要依据。除应满足一般测试的准入条件外，在进行验收测试之前，应确认被测试软件系统已通过系统测试。


下面两个没有顺序

* 配置项测试：测试对象是<font color='RedOrange'>软件配置项</font>，测试目的是<font color='RedOrange'>检验软件配置项与 SRS 的一致性</font>。测试的依据是 SRS。在此之间，应确认被测试软件配置项已经通过单元测试。

* **回归测试**：测试的目的是<font color='RedOrange'>测试软件变更之后，变更部分的正确性和对变更需求的符合性，以及软件原有的、正确的功能、性能和其它规定的要求不损害性</font>。

## 测试策略
自底向上：<font color='RedOrange'>从最底层模块开始测试，需要编写驱动程序</font>，而后开始逐一合并模块，最终完成整个系统的测试。<font color='RedOrange'>优点是较早验证了底层模块</font>。（先单元测试，后集成测试）

自顶向下：<font color='RedOrange'>先测试整个系统，需要编写桩程序，而后逐步向下直至测试最底层模块</font>。优点是<font color='RedOrange'>较早的验证了系统的主要控制和判断点</font>。

三明治：既有自底向上也有自顶向下的测试方法，<font color='RedOrange'>二者都包括。兼有二者的优点，缺点是测试工作量大</font>。


## 测试用例的设计

### <font color='RedOrange'>黑盒测试用例</font>
将程序看作一个黑盒子，只知道输入输出，不知道内部代码，由此设计出测试用例,分为以下几类：

1. <font color='RedOrange'>等价类划分</font>：把所有的数据按某种特性进行归类，而后在每类数据里选取一个即可。等价类测试用例的设计原则：<font color='RedOrange'>设计一个新的测试用例，使其尽可能多地覆盖尚未被覆盖的有效等价类</font>，重复这一步，直到所有的有效等价类都被覆盖为止；<font color='RedOrange'>设计一个新的测试用例，使其仅覆盖一个尚未被覆盖的无效等价类</font>，重复这一步，直到所有的无效等价类都被覆盖为止。
1. 边界值划分：将每类的边界值作为测试用例，边界值一般为<font color='RedOrange'>范围的两端值以及在此范围之外的与此范围间隔最小的两个值</font>，如年龄范围为 0-150，边界值为 0,150,-1,151 四个
1. 错误推测：没有固定的方法，凭经验而言，来推测有可能产生问题的地方，作为测试用例进行测试。
1. 因果图：由一个结果来反推原因的方法，具体结果具体分析，没有固定方法。



### <font color='RedOrange'>白盒测试用例</font>
知道程序的代码逻辑，按照程序的代码语句，来设计覆盖代码分支的测试用例，覆盖级别从低至高分为下面几种：

1. <font color='RedOrange'>语句覆盖 SC</font> : 逻辑代码中<font color='RedOrange'>所有的语句都要被执行一遍，覆盖层级最低</font> ，因为执行了所有的语句。（执行了所有的语句，不代表执行了所有的判断条件），语句覆盖只需要走完一个测试用例即可。
2. <font color='RedOrange'> 判定覆盖  DC</font>：逻辑代码中的<font color='RedOrange'>所有判断语句的条件的真假分支都要覆盖一次</font> 。一个 IF 语句表示一个判断，但是一个 IF 里面有很多的条件。
![image-20240915123258904](https://wkq-img.oss-cn-chengdu.aliyuncs.com/img/202409151233942.png)
3. <font color='RedOrange'>条件覆盖 CC</font>：针对每一个判断条件内的<font color='RedOrange'>每一个独立条件都要执行一遍真和假</font>。满足条件覆盖不一定满足判定覆盖，是两种不同的方式。
:::tip
判定覆盖和条件符号是不一样的，满足了判定条件覆盖不一定满足判定覆盖。判定覆盖比条件覆盖覆盖率高。
:::
4. <font color='RedOrange'>条件判定组合覆盖 CDC：同时满足覆盖和条件覆盖。</font>
![](https://wkq-img.oss-cn-chengdu.aliyuncs.com/img/202410020225734.png)

5. <font color='RedOrange'>路径覆盖</font>：逻辑代码中的<font color='RedOrange'>所有可行路径都覆盖了，覆盖层级最高</font>。走完所有执行路线的组合,比如下图有四种路线。
 ![image-20240915133423708](https://wkq-img.oss-cn-chengdu.aliyuncs.com/img/202409151334262.png)

:::tip
找路径就是从开始到结束挨个划线。
:::
## 调试

* 测试是发现错误，<font color='RedOrange'>调试是找出错误的原因和代码</font>
* 调试需要<font color='RedOrange'>确定错误的准确位置；确定问题的原因并设法改正；改正后要进行回归测试</font>。
* 调试的方法有：<font color='RedOrange'>蛮力法、回溯法</font>（从出错的位置开始，向回找）、<font color='RedOrange'>原因排除法</font>（找出所有可能的原因，逐一进行排除，具体的包括演绎法、归纳法、二分法）

## 软件度量

<font color='RedOrange'>软件的两种属性：外部属性指向面向管理者和用户的属性，可直接测量</font>，一般为<font color='RedOrange'>性能指标</font>。内部属性值指<font color='RedOrange'>软件产品本身的属性，如可靠性等，只能间接测量</font>。



<font color='RedOrange'>McCabe 度量法(每年都要考)</font>：又称为环路复杂度，假设有向图中<font color='RedOrange'>有向边数为 m，节点数为 n，则此有向图的环路复杂度为 m-n+2</font>。



注意 m 和 n 代表的含义不能混淆，可以用一个最简单的环路来做特殊值记忆此公式，另外，针对一个程序流程图，每一个分支边（连线）就是一条有向边，每一条语句（框：包括开始、结束、选择框）就是一个顶点。

